//
//  BaseViewController.m
//  Connotation
//
//  Created by LZXuan on 15-4-7.
//  Copyright (c) 2015年 LZXuan. All rights reserved.
//

#import "BaseViewController.h"


@interface BaseViewController ()

@end

@implementation BaseViewController
- (void)dealloc {
    
    self.headerView = nil;
    self.tableView =  nil;
    self.category = nil;
    self.max_timestamp = nil;
    self.dataArr = nil;
    [super dealloc];
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    //改变状态栏的颜色
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    //设置导航条背景图片
    self.automaticallyAdjustsScrollViewInsets = NO;
    self.edgesForExtendedLayout = UIRectEdgeNone;//无边框填充
    self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:49/255.0 green:43/255.0 blue:160/255.0 alpha:1.0];
    //[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"NavBackgroundImage_iOS6"] forBarMetrics:UIBarMetricsDefault];
    [self creatNavItemView];
    //创建 下载对象
    [self creatHttpRequest];
    //创建表格视图
    [self creatTableView];
   // [self isNetWork];//检测网络状态，解归档
    
    
    
    
    
    
}
- (void)creatNavItemView{
    //导航栏文字
    self.Nav_title = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 44)];
    self.Nav_title.textColor = [UIColor whiteColor];
    self.Nav_title.backgroundColor = [UIColor clearColor];
    self.Nav_title.font = [UIFont systemFontOfSize:17.0];
    self.Nav_title.textAlignment = NSTextAlignmentCenter;
    self.navigationItem.titleView = self.Nav_title;
    self.view.backgroundColor = [UIColor colorWithRed:246/255.0 green:246/255.0 blue:246/255.0 alpha:1.0];
}

#pragma mark - 解归档
//解归档
-(void)archiveMyData:(NSString *)str{
    NSUserDefaults *userDefaults=[NSUserDefaults standardUserDefaults];
    NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    NSString *filePath=[docPath stringByAppendingPathComponent:str];
    BOOL archivesuccess=[NSKeyedArchiver archiveRootObject:self.dataArr toFile:filePath];
    [userDefaults setObject:@"成功" forKey:@"archivesuccess"];
    [userDefaults synchronize];
   // NSLog(@"文件路径%@",filePath);
    if(archivesuccess){
        NSLog(@"保存成功");
    }
}
-(void)unarchiveMyData:(NSString *)str{
    NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    NSString *filePath=[docPath stringByAppendingPathComponent:str];
    self.dataArr=[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"解档成功");
}
-(void)isNetWork{
    BOOL isnet=[LZXHelper reachability];
    if(isnet){
        //第一次下载
        _currentPage = 0;
        self.max_timestamp = @"-1";
        [self loadDataPage:_currentPage count:15];
        
        //再创建刷新
        [self creatRefreshView];
        //点击 加载更多
        [self upPullView];
    }else {
        [self unarchiveMyData:@"data"];
        [_tableView reloadData];
    }
}

#pragma mark - 刷新
- (void)creatRefreshView {
    self.headerView = [[[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0, -self.tableView.bounds.size.height, self.tableView.bounds.size.width, self.tableView.bounds.size.height)] autorelease];
    
    self.headerView.delegate = self;
    //获取最后一次 刷新时间
    [self.headerView refreshLastUpdatedDate];
    //粘贴到tableView
    [self.tableView addSubview:self.headerView];
    _isRefreshing = NO;
    
}
- (void)upPullView {
    _isLoadMore = NO;
    //给tableView增加一个按钮尾视图
    
    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    button.frame = CGRectMake(0, 0, self.tableView.bounds.size.width, 44);
    [button setTitle:@"点击加载更多..." forState:UIControlStateNormal];
    [button addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
    self.tableView.tableFooterView = button;
}
- (void)btnClick:(UIButton *)button {
    
    if (_isLoadMore) {
        return;
    }
    _currentPage ++;
    //加载更多 记录的是 数据源数组中的最后一个model 的时间
    self.max_timestamp = [[_dataArr lastObject] update_time];
    _isLoadMore = YES;
    [self loadDataPage:_currentPage count:15];
    
}

#pragma mark - 滚动视图协议
//停止拖拽
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    [self.headerView egoRefreshScrollViewDidEndDragging:scrollView];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [self.headerView egoRefreshScrollViewDidScroll:scrollView];
}
#pragma mark - ego协议
//是否正在刷新
//yes表示正在刷新 返回yes 不能刷新
//                  NO 可以刷新
- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view {
    return _isRefreshing;
}
//开始刷新 如果上面的方法 返回no 才调用
- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view {
    _isRefreshing = YES;
    _currentPage = 0;
    self.max_timestamp = @"-1";
    [self loadDataPage:_currentPage count:15];
    
}
- (NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view {
    return [NSDate date];
}

#pragma mark - 创建 下载对象
- (void)creatHttpRequest {
    _httpRequest = [[LZXHttpRequest alloc] init];
    
    self.dataArr = [[NSMutableArray alloc] init];
}
//按页下载
- (void)loadDataPage:(NSInteger)page count:(NSInteger)count {
    //视频界面 需要 完全重写
    
    
    NSString *url = [NSString stringWithFormat:kContentsUrl,self.category,page,count,self.max_timestamp];
    
    //在非arc 中 block 出现 self (或者成员变量的操作) 那么我们需要用__block 否则可能会导致死锁
    //在arc 下面block 出现 出现 self (或者成员变量的操作) 那么我们需要用__weak 否则可能会导致死锁
    
    __block BaseViewController *mySelf = self;
    
    [_httpRequest downloadRequestWithUrl:url
            success:^(LZXHttpRequest *request) {
            //下载成功
        [mySelf downloadDataSuccess:request];
                
    } fail:^(NSError *error) {
        NSLog(@"下载失败");
    }];
}
- (void)downloadDataSuccess:(LZXHttpRequest *)request {
    
    if (request.downloadData) {
        
        
        if (_currentPage == 0) {//下拉刷新
            [self.dataArr removeAllObjects];
        }
        
        //解析数据  看数据 是xml 还是json
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:request.downloadData options:NSJSONReadingMutableContainers error:nil];
        NSArray *itemArr = dict[@"items"];
        //遍历数组
        for (NSDictionary *itemDict in itemArr) {
            //把数据 保存到model 中
            PicModel *model = [[PicModel alloc] init];
            
            /*
             kvc会根据itemDict中的key 去model 找对应的属性 ，然后把itemDict中value 赋给相应地model属性值，
             如果itemDict字典的key 在model 中找不到对应的 属性名
             那么会调用 - (void)setValue:(id)value forUndefinedKey:(NSString *)key
             */
            
            //使用kvc 同时对多个属性赋值
            [model setValuesForKeysWithDictionary:itemDict];
            //加入数据源数组
            [self.dataArr addObject:model];
            [model release];
        }
        [self archiveMyData:@"data"];
        //刷新 表格
        [self.tableView reloadData];
        _isLoadMore = NO;
        _isRefreshing = NO;
        //ego 停止刷新
        [self.headerView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];
        
    }
}


#pragma mark - 创建表格视图
- (void)creatTableView {
    self.automaticallyAdjustsScrollViewInsets = NO;
    self.tableView = [[[UITableView alloc] initWithFrame:CGRectMake(0,0, kScreenSize.width, kScreenSize.height-64-49) style:UITableViewStylePlain] autorelease];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    self.tableView.tableFooterView=[[UITableViewHeaderFooterView alloc]init];
    [_tableView.tableFooterView release];
    [self.view addSubview:self.tableView];
}

#pragma mark - tableView协议
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.dataArr.count;
    NSLog(@"-------%ld",self.dataArr.count);
}
//创建 /获取cell 地址
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //视频界面需要完全重写
    
    static NSString *cellName = @"PicCell";
    
    PicCell *cell = [tableView dequeueReusableCellWithIdentifier:cellName];
    if (cell == nil) {
        cell = [[[NSBundle mainBundle] loadNibNamed:@"PicCell" owner:self options:nil] lastObject];
    }
    
    PicModel *model = self.dataArr[indexPath.row];
    
    //填充cell 传入 分类
    [cell showDataWithModel:model category:self.category];
    //在这里 把 block 传给cell cell 内部点击 评论的时候就可以调用
    
    __block BaseViewController *mySelf = self;
    cell.myblock = ^(NSString *url) {
        CommentViewController *comments = [[CommentViewController alloc]  init];
        comments.commentUrl = url;
        //界面跳转
        [mySelf.navigationController pushViewController:comments animated:YES];
        [comments release];
    };
    
    return cell;
}
//动态计算 每个cell 的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    //视频界面 需要完全重写
    
    PicModel *model = self.dataArr[indexPath.row];
    
    CGFloat height = 27;
    
    if (model.wbody) {
        //如果 第二个label 有内容才动态算高度
        height += [LZXHelper textHeightFromTextString:model.wbody width:280 fontSize:14]+5;
    }
    
    if (model.wpic_middle) {//判断有没有图片
        //真实高/真实宽 = h/280
        height += [model.wpic_m_height doubleValue] *280/[model.wpic_m_width doubleValue]+10;
    }
    height += 27 + 10;
    /*
     如果代码中崩溃原因是:table view row height must not be negative - provided height for index path 
     主要是 在计算行高的 除数出现0的情况 这样 程序会崩溃
     */
    
    return height;
}

/*
 iOS6之后通过代码来设置 当前旋转的视图控制器屏幕 必须是window的根视图控制器（window 的rootViewController）或者是rootViewController 模态(present)跳转出来的子视图控制器(push 的不行,push出得子视图控制 用代码设置旋转 是没有作用的)
 
 如果根视图控制器是导航 那么只能由导航的shouldAutorotate
 supportedInterfaceOrientations 重写这两个方法
 通过类别 或者继承的方式增补方法
 */
/*
 plist 配置文件设置的旋转方向控制的全局 所有界面的
 
 如果代码中子视图控制器也设置了那么在旋转那个子视图控制器的屏幕时取plist文件和代码设置 旋转的交集  如果没有交集程序就会crash 崩溃
 
 */
//需求:一般 写项目  app 只支持一个方向 这时我们只需要 把plist 改成支持 竖屏或者横屏就可以了
//需求2:有时候我们项目 中 app 需要 第二个界面 支持 三个方向旋转，第1个界面 只支持竖屏一个方向 ，这时我们 使用plist 文件 修改是不能实现的，
//解决:我们可以先用plist配置文件设置，然后通过代码的形式 单独 对 单个子视图控制器的界面进行设置旋转

//代码设置 需要写两个方法
//用代码控制 是否当前界面支持旋转
- (BOOL)shouldAutorotate {
    //代码设置 界面屏幕旋转 这个方法必须写在 window的根视图控制器 /或者 是window 的根视图控制器模态(present)出来的 类中才有效，否则 代码无效
    
    return YES;
}
//设置 当前界面 支持旋转的方向
- (NSUInteger)supportedInterfaceOrientations {
    //竖直方向
    return UIInterfaceOrientationMaskPortrait;
    
    //return UIInterfaceOrientationMaskPortrait;
    /*
     UIInterfaceOrientationMaskLandscapeLeft 左旋转
     UIInterfaceOrientationMaskLandscapeRight 右旋转
     UIInterfaceOrientationMaskAll 所有方向（要和plist文件 一起设置）
     UIInterfaceOrientationMaskAllButUpsideDown (除了向下 其他方向支持)
     */
}



@end
